iT邦幫忙

2024 iThome 鐵人賽

DAY 23
1
生成式 AI

Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用系列 第 23

【Day23】Dify 工作流 (6):用「變量聚合器」來簡化流程!(貓貓狗勾猜測機器人)

  • 分享至 

  • xImage
  •  

前言

昨天我們用 Dify 串接了貓貓狗狗的 API,今天來將這些 API 利用大型語言模型的力量,來做一個可以判斷狗狗品種,並且回傳圖片的機器人吧!

為什麼想做這個呢?因為我有時候在路上看到狗勾,但不知道他是什麼品種,又不像貓咪可以通常我們都說「橘貓最胖」「黑貓」「白貓」(對誒為什麼好像比較少人會說自己養的貓是什麼品種?都是狗勾比較多,是因為不同品種的差異很大嗎XD)

修改狗勾工作流

分析 API (取得特定品種的狗)

參考 Dog CEO 的官網,這個 API 可以根據狗的品種來取得隨機的照片 網站

不過我們要怎麼知道要用什麼 API 才能得到我們要的狗勾的照片呢?於是我到 document 那邊找,發現你可以用 https://dog.ceo/api/breeds/list/all 來取得所有狗品種的名稱

不過這邊會發現,有這種階層式的結構

以查理王騎士犬為例,到剛剛那個網站去看圖片連結網址

會發現是 https://images.dog.ceo/breeds/spaniel-blenheim/n02086646_4148.jpg ,表示 breed list 那邊的階層結構會是 spaniel-blenheim 這樣,這是很重要的資訊。

根據 https://dog.ceo/dog-api/documentation/sub-breed 的說明,這種有子品種的狗勾,我們會需要用 / 來指定,所以如果你像要請求隨機一張查理王騎士犬的照片,就會需要向以下的 url 發送請求:

https://dog.ceo/api/breed/spaniel/blenheim/images/random

然後你會得到

{
	"message": "https://images.dog.ceo/breeds/spaniel-blenheim/n02086646_2430.jpg",
	"status": "success"
}

現在一切都搞懂了,我們可以開始來設計 Propmt 了!

判斷狗的品種

昨天我們把 Dog CEO 串接 API 的流程變成一個 Workflow 了,今天要再深入修改這個工作流,讓 LLM 去分析使用者輸入的狗勾特徵,然後判斷他可能是哪一種狗。

在開始節點新增一個段落變數 user_query 表示要分析的句子

一樣使用 Anthropic prompt generator 來產生提示詞,注意一定要告訴 Anthropic 你希望他輸出的狗狗品種有哪些、要用什麼形式來表達等等,寫得愈清楚越好。同時,如果沒有足夠的特徵,那就直接回傳 Insufficient information。而且我們也不一定只有一種狗,可能同時滿足多個特徵,所以這邊也要告訴 prompt generator 可以回傳多個品種

產生 propmt

然後新增一個 LLM 節點

測試一下「日本常見的狗,通常是棕色的」,這邊成功卻輸出 Insufficient-information???提示已經夠明顯了吧?

一樣的問題拿去問一樣的模型,結果他明明判斷的出來哇

拆開複雜節點

為什麼會這樣呢?這邊可能的猜測是,語言模型對於簡單任務表現較好,但是我剛剛讓模型做的卻是「先判斷特徵」->「根據列表選擇名稱」->「輸出特定格式」,這些任務分開看都不難,但是合併在一起對一個語言模型來說就太複雜了,所以才會有主觀上表現差的結果 (也可能是 prompt 設計不夠好)

所以我們這邊修改一下流程,先判斷狗狗可能的種類,再根據這些種類,選擇列表中有出現過的英文名稱,並且格式化成 api 可以用的形式

測試單一節點的時候,可以用這個小三角形來測試,超方便

至於其他的節點因為有點 trivial,文章的最後我會把這個工作流匯出成 DSL,並上傳到 Github 上

測試一下結果還不錯

然後我們就可以使用迭代節點,來對每一種品種都做一次 http 請求

最後測試一下,感覺還不錯

不過這邊還少做一個動作,就是增加一個條件判斷當迭代為空,也就是 LLM 認為不符合任何狗的品種的情況

然後在 result 為空的情況,直接輸出一個空的 list

變量聚合器

終於要介紹他了,有沒有發現剛剛的流程,我們共有兩個結束節點

其實我們也可以將「輸出 empty list」 和迭代的結果集中到一個「變量聚合器」中,因為他們的輸出格式是相同的 (都是 Array[String]),這樣可以幫助我們簡化流程

設定變量聚合器,我們要搜集的變數有從「迭代每一個狗的品種」來的,和「輸出 empty list」
記得修改結束節點的輸出為變量聚合器的輸出

最後的流程會長這樣,是不是變得超級複雜的,別忘了這個還只是一個「工作流 (workflow)」的節點,試想如果這些東西都放到 Chatflow,那豈不是要複雜到不行QQ (用 LangChain 更慘)

如果上面你自己實作有點困難,可以下載我的 DSL,並直接匯入到你的 Dify 中。

小結

明天來把今天弄好的狗狗工作流整合到 Chatflow 中,至於貓咪的部分我有點懶得做了XD ,所以這個機器人應該就叫做「狗狗特徵猜測機器人」,然後加入一些 Dify 內建的聊天功能,來讓整個 App 更完整

像這樣看似有點複雜的應用,其實最困難的部分是例外處理,所以有 log 的開發環境真的很重要...

其實我自己在做的時候也沒什麼問題,但要寫成文章就要去思考,這樣示範好嗎?這邊要貼 code 嗎?這邊可以略過嗎?現在才知道原來那些大佬之所以是大佬不只是因為東西做出來夠專業,呈現給別人看的時候還能用自己的話把它講得很簡單,shout out to 這些貢獻優質文章給網路的人們~


上一篇
【Day22】Dify 工作流 (5):在 Dify 中使用「HTTP 請求」,並且把流程變成「工作流 (workflow)」!(貓貓狗勾猜測機器人)
下一篇
【Day24】Dify 工作流 (7): 新增聊天功能,讓使用者體驗 🆙🆙🆙 (貓貓狗勾猜測機器人)
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言